package cn.zhiwen.reflectController;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

public class ReflectDemo02 {
    public static void main(String[] args) {
        try {
            Class aClass = Class.forName("cn.zhiwen.entity.Student");

            //2.获取所有公有构造方法
            System.out.println("**********************所有公有构造方法*********************************");
            Constructor[] constructors = aClass.getConstructors();
            for (Constructor constructor : constructors) {
                System.out.println(constructor);
                System.out.println(constructor.getName());
            }

            System.out.println("************所有的构造方法(包括：私有、受保护、默认、公有)***************");
            Constructor[] declaredConstructors = aClass.getDeclaredConstructors();
            for (Constructor declaredConstructor : declaredConstructors) {
                System.out.println(declaredConstructor);
            }

            System.out.println("*****************获取公有、无参的构造方法*******************************");
            Class<?> aClass1 = Class.forName("java.lang.String");
            Constructor constructor = aClass.getConstructor(null);
            //1>、因为是无参的构造方法所以类型是一个null,不写也可以：这里需要的是一个参数的类型，切记是类型
            //2>、返回的是描述这个无参构造函数的类对象。
            System.out.println("con = " + constructor);
            //调用构造方法
            Object o = constructor.newInstance();

            System.out.println("******************获取私有构造方法，并调用*******************************");
            Constructor declaredConstructor = aClass.getDeclaredConstructor(String.class,String.class);
            System.out.println(declaredConstructor);
            //调用构造方法
            declaredConstructor.setAccessible(true);//暴力访问
            Object o1 = declaredConstructor.newInstance("na","na");


        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
    }
}
